package com.wyl.template.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Auther: wyl
 * @Date: 2021/6/22
 * @Description:
 */
@Slf4j
public class DateUtils {

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static final String F_DATETIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * yyyy-MM-dd
     */
    public static final String F_DATE = "yyyy-MM-dd";


    private DateUtils() { // 构造函数私有，静态工具类，不允许外部创建
    }

    /**
     * 取得给定字符串描述的日期对象，描述模式采用 format 指定的格式.
     *
     * @param dateStr 日期描述
     * @param format  日期模式
     * @return 给定字符串描述的日期对象。
     */
    public static Date parseDate(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date resDate = null;
        try {
            resDate = sdf.parse(dateStr);
        } catch (Exception e) {
            log.error("日期转换出错,dateStr={},format={},errMessage={}", dateStr, format, e.getMessage());
        }
        return resDate;
    }

    /**
     * 格式化日期显示格式
     *
     * @param dateStr 原始日期格式
     * @param format  格式化后日期格式
     * @return 格式化后的日期显示
     */
    public static String dateFormat(String dateStr, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        java.sql.Date date = java.sql.Date.valueOf(dateStr);
        return formatter.format(date);
    }

    /**
     * 格式化日期显示格式
     *
     * @param date   日期
     * @param format 日期格式
     * @return 格式化后的日期显示
     */
    public static String dateFormat(Date date, String format) {
        if (date == null || !StringUtils.hasText(format)) {
            return "";
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(date);
    }


    /**
     * 日期字符串转日期类型 yyyy-MM-dd HH:mm:ss
     *
     * @param dateStr
     * @return
     */
    public static Date parseToDateTime(String dateStr) {
        return parseDate(dateStr, F_DATETIME);
    }

    /**
     * 日期字符串转日期类型 yyyy-MM-dd
     *
     * @param dateStr
     * @return
     */
    public static Date parseToDate(String dateStr) {
        return parseDate(dateStr, F_DATE);
    }


    /**
     * 字符串自动转日期类型
     *
     * @param dateStr
     * @return
     */
    public static Date pareToDateAuto(String dateStr) {
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy/MM/dd");
        SimpleDateFormat sdf5 = new SimpleDateFormat("yyyyMMddHHmmss");
        SimpleDateFormat sdf6 = new SimpleDateFormat("yyyyMMdd");
        Date date = null;
        try {
            date = sdf1.parse(dateStr);
        } catch (ParseException e) {
            try {
                date = sdf2.parse(dateStr);
            } catch (ParseException e1) {
                try {
                    date = sdf3.parse(dateStr);
                } catch (ParseException e2) {
                    try {
                        date = sdf4.parse(dateStr);
                    } catch (ParseException e3) {
                        try {
                            date = sdf5.parse(dateStr);
                        } catch (ParseException e4) {
                            try {
                                date = sdf6.parse(dateStr);
                            } catch (ParseException e5) {
                                log.error("字符串自动转日期类型失败,dateStr={},errMessage={}", dateStr, e5.getMessage());
                            }
                        }
                    }
                }
            }
        }
        return date;
    }
}
